// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。shu jian defg

package hash

import "io"

// 哈希是所有哈希函数实现的公共接口。
// 
// 标准库中的哈希实现（例如哈希/crc32和
// 加密/sha256）实现编码。二进制封送处理程序和
// 编码。二进制解组器接口。封送散列实现
// 允许保存其内部状态，并在以后用于附加处理
// 而无需重新写入之前写入散列的数据。
// 散列状态可能包含原始形式的部分输入，
// 对于任何可能的安全隐患，用户都应该处理这些输入。
// 
// 兼容性：未来对哈希或加密包的任何更改都将努力保持与使用以前版本编码的状态的兼容性。
// 也就是说，软件包的任何发布版本都应该能够解码使用任何以前发布的版本写入的数据，
// 可能会出现安全修复等问题。
// 有关背景信息，请参阅Go兼容性文档：https:
type Hash interface {
	// Write（通过嵌入式io.Writer接口）将更多数据添加到正在运行的哈希中。
	// 它从不返回错误。
	io.Writer

	// Sum将当前哈希值附加到b并返回结果切片。
	// 它不会更改基础哈希状态。
	Sum(b []byte) []byte

	// 重置将哈希重置为初始状态。
	Reset()

	// Size返回Sum将返回的字节数。
	Size() int

	// BlockSize返回哈希的基础块大小。
	// Write方法必须能够接受任意数量的
	// 数据，但如果所有写入
	// 都是块大小的倍数，则它的运行效率可能会更高。
	BlockSize() int
}

// Hash32是所有32位哈希函数实现的公共接口。
type Hash32 interface {
	Hash
	Sum32() uint32
}

// Hash64是由所有64位哈希函数实现的公共接口。
type Hash64 interface {
	Hash
	Sum64() uint64
}
